#ifndef TETRIS_H
#define TETRIS_H

#include <QMainWindow>
#include<qpainter.h>

const int BLOCK_SIZE=30;//单个方块单元的边长
const int MARGIN=20;//场景边距
const int AREA_ROW=24;//场景行数
const int AREA_COL=16;//场景列数

//方向
enum Direction
{
    UP,
    DOWN,
    LEFT,
    RIGHT,
    SPACE
};

//定义边界信息
struct Border
{
    int ubound;
    int dbound;
    int lbound;
    int rbound;
};

//坐标
struct block_point
{
    int pos_x;
    int pos_y;
};

namespace Ui { class Tetris; }

class Tetris : public QMainWindow
{
    Q_OBJECT

public:
    enum GameStatus{RUNNING,STOP,PAUSE};

    void InitGame();//初始化
    void InitMenu();//菜单初始化
    void StartGame();//开始游戏
    void PauseOrContinueGame();//暂停或者停止
    void GameOver();

    void ResetBlock();//重置方块
    void CreatBlock(int block[4][4],int block_id);//产生方块
    void GetBorder(int block[4][4],Border &border);//计算边界
    void BlockMove(Direction dir);//方块移动
    void BlockRotate(int block[4][4]);//方块转动
    bool IsCollide(int x,int y,Direction dir);//判断是否碰撞
    void ConvertStable(int x,int y);//转换为稳定方块

signals:

public slots:
    void slotStartGame();
    void slotPauseGame();
    void slotStopGame();
    void slotHelp();

private:
    Ui::Tetris *ui;

public:
    explicit Tetris(QWidget *parent=0);
    ~Tetris();
    virtual void keyPressEvent(QKeyEvent*event);//键盘事件
    virtual void timerEvent(QTimerEvent*event);//定时器事件
    virtual void paintEvent(QPaintEvent*event);//场景刷新


private:
    int game_area[AREA_ROW][AREA_COL];//场景区域，1表示活动的方块，2表示稳定的方块，0表示空
    block_point block_pos;//当前方块坐标
    int cur_block[4][4];//当前方块形状
    Border cur_border;//当前方块边界；
    int next_block[4][4];//下一个方块形状
    int speed_ms;//下落时间间隔
    int refresh_ms;//刷新时间间隔
    int game_timer;//方块下落计时器
    int paint_timer;//渲染刷新计时器
    int score;//分数
    QMenu *menu;
    QMenu *helpMenu;
    QAction *startGameAction;
    QAction *stopGameAction;
    QAction *pauseOrcontinueGameAction;
    QAction *helpAction;
    volatile GameStatus gameStatus=GameStatus::STOP;

};
#endif // TETRIS_H